package list;

import java.util.*;
import java.util.function.Consumer;

import org.junit.Test;



public class ArrayListDemo {
	
	@Test
	public void createList() {
		// 无参构造创建空集合, size=0
		ArrayList list = new ArrayList(); 
		// 初始容量
		ArrayList list2 = new ArrayList(20);
		// 由其他集合构造一个新集合
		ArrayList list3 = new ArrayList<>(list);
		
		// 构造一个不可变长度的集合, 只能读不能添加和删除
		List<? extends Object> asList = Arrays.asList("abc",123,true,1.1);
	}
	
	@Test
	public void useful() {
		// 1.添加元素
		ArrayList<String> al = new ArrayList<>(); 
		al.add("abc");
		al.add("def");
		al.add("hij");
		al.add("abc");
		// 在某个位置上添加
		al.add(0, "www");
		System.out.println(al);
		// 2.根据下标设置
		al.set(0, "abcd");
		// 3.根据下标获取
		String string = al.get(0);
		// 4.求长度
		int size = al.size();
		// 5.是否包含
		boolean contains = al.contains("abc");
		// 6.求元素下标
		int indexOf = al.indexOf("def");
		int lastIndexOf = al.lastIndexOf("hij");
		// 7.判断是否为空
		boolean empty = al.isEmpty();
		// 8.根据下标移除，返回被删除元素
		String remove = al.remove(0);
			//根据元素移除
		boolean remove2 = al.remove("www");
		// 9.把删除的位置都整理，有值的往前移动
		al.trimToSize();
		// 10.转成数组
		Object[] array = al.toArray();
		// 11.截取子列表,下标包前不包后
		List<String> subList = al.subList(0, 2);
		// 12.清空
		al.clear();
	}
	
	@Test
	public void sort() {
		ArrayList<String> al = new ArrayList<>(); 
		al.add("abc");
		al.add("hij");
		al.add("abc");
		al.add("def");
		al.add("zey");
		
		al.sort(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				// 前-后，  前比后 从小到大。  后-前，后比前 从大到小
//				return o1.compareTo(o2);
				return o2.compareTo(o1);
			}
		});
		System.out.println(al);
	}

	
	@Test  // 遍历：每个元素过一遍
	public void foreach() {
		ArrayList<String> al = new ArrayList<>(); 
		al.add("abc");
		al.add("hij");
		al.add("abc");
		al.add("def");
		al.add("zey");
		System.out.println(al);
		
		//1.传统for
		for (int i = 0,j = al.size(); i < j ; i++) {
			System.out.println(al.get(i));
		}
		System.out.println("--------------------");
		
		//2.增强for
		for (String s : al) {
			System.out.println(s);
		}
		System.out.println("--------------------");
		
		//3.1 通过列表得到指向自己的迭代器 （只能向下移动）
		Iterator<String> it = al.iterator();
		// 3.2 用迭代器循环
		while (it.hasNext()) {
			String next = it.next();
			System.out.println(next);
		}
		System.out.println("--------------------");
		
		// 4.1 通过列表得到指向自己的列表迭代器 （可以上下移动）
		ListIterator<String> it2 = al.listIterator();
		while (it2.hasNext()) {
			String next = it2.next();
			System.out.println(next);
		}
		System.out.println("--------------------");
		
		while(it2.hasPrevious()) {
			String previous = it2.previous();
			System.out.println(previous);
		}
		System.out.println("--------------------");
		
		// 5.新增的forEach
		al.forEach(new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.println(t);
			}
		});
		
		System.out.println("--------------------");
		al.forEach(System.out::println);
	}
}

















